package com.sc.nft.dao;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicLong;

/**
 * SecondCollection 数据同步逻辑，仅供定时任务使用
 */
@Slf4j
@Repository
@RequiredArgsConstructor
public class SecondCollectionSyncDao {

    private final JdbcTemplate jdbcTemplate;
//    private final SecondCollectionEsDao esDao;
//    private final SecondCollectionMapper baseMapper;

    private final String table = "sc_second_collection";

//    /**
//     * 同步MySQL数据到ES（临时，同步工具，业务接口不能调用，待功能稳定后将删除该方法）
//     *
//     * @param minId 同步最小ID
//     * @param maxId 同步最大ID
//     * @param limit 每页长度
//     * @return 同步记录行数
//     */
//    public long syncToEs(long minId, long maxId, long limit) {
//
//        // 计算页数
//        final long pages = (maxId - minId) / limit + 1;
//
//        // 并行同步
//        return LongStream.range(0, pages).parallel().map(pageIndex -> {
//            final long begin = minId + pageIndex * limit;
//            final long end = Math.min(begin + limit - 1, maxId);
//            return syncToEs0(begin, end);
//        }).sum();
//    }
//
//    private long syncToEs0(long begin, long end) {
//        log.info("开始同步，ID范围 [{}, {}]", begin, end);
//
//        // 查询数据
//        List<SecondCollection> list = baseMapper.export(begin, end);
//        if (CollectionUtils.isEmpty(list)) {
//            log.info("完成同步，ID范围 [{}, {}]，同步数量 {}", begin, end, 0);
//            return 0L;
//        }
//
//        // 同步写入ES
//        try {
//            esDao.bulkIndex(list);
//            log.info("完成同步，ID范围 [{}, {}]，同步数量 {}", begin, end, list.size());
//            return list.size();
//        } catch (IOException e) {
//            log.error("同步异常，ID范围 [{}, {}]，同步数量 {}", begin, end, list.size(), e);
//            return 0L;
//        }
//
//    }


    /**
     * 滚动删除数据，业务端禁止调用
     *
     * @param maxTime 最大时间
     * @param stop    停止ID（可选）
     * @return 删除记录行数
     */
    public long deleteHistory(@NonNull LocalDateTime maxTime, Long stop) {

        log.info("开始删除 {} 历史数据，数据范围 maxTime: {}, stop: {}", table, maxTime, stop);

        final AtomicLong counter = new AtomicLong();

        while (true) {
            int rows = delete(maxTime, stop);
            counter.addAndGet(rows);
            if (rows <= 0) {
                break;
            }
        }

        log.info("完成删除 {} 历史数据，数据范围 maxTime: {}, stop: {}, rows: {}", table, maxTime, stop, counter.get());
        return counter.get();
    }

    private int delete(@NonNull LocalDateTime maxTime, Long stop) {
        final long limit = 1000L;
        final String sql = "DELETE FROM " + table + " WHERE create_time < ? AND status NOT IN (1, 4)";

        if (stop != null) {
            return jdbcTemplate.update(String.format("%s AND id < ? ORDER BY id ASC LIMIT ?", sql), maxTime, stop, limit);
        }

        return jdbcTemplate.update(String.format("%s ORDER BY id ASC LIMIT ?", sql), maxTime, limit);
    }

}